home *** CD-ROM | disk | FTP | other *** search
/ Your Choice 3 / Your Choice Software Collection 3.iso / prgmming / pbmodx10 / vgatest.bas < prev    next >
BASIC Source File  |  1994-08-11  |  13KB  |  562 lines

  1. ' Demo of MODEX Library for PowerBASIC
  2. ' (c) Copyright 1994 by Dave Navarro, Jr.
  3. ' portions (c) Copyright 1992,93 by Matt Pritchard
  4.  
  5. ' You may use this library for your own use, and commercial use without
  6. ' any fee requirements from the authors.  However, you must include copyright
  7. ' information for the library in your source code comments "at the very least".
  8.  
  9. ' This library uses 16 bit calls and requires a 286 machine or better for
  10. ' programs written with it.
  11.  
  12. ' There is no documentation for this library at this time.  Just print this
  13. ' source code file to see what we're doing.
  14.  
  15. $LINK "MODEX.PBL"
  16. DEFINT A-Z
  17.  
  18. DECLARE SUB ERROR.OUT (Message$)
  19. DECLARE FUNCTION GET.KEY% ()
  20. DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%)
  21. DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%)
  22.  
  23. TYPE ShapeType
  24.     ImgData AS STRING * 512
  25.     xWidth  AS INTEGER
  26.     yWidth  AS INTEGER
  27. END TYPE
  28.  
  29. TYPE Sprite
  30.     Xpos    AS INTEGER
  31.     Ypos    AS INTEGER
  32.     XDir    AS INTEGER
  33.     YDir    AS INTEGER
  34.     Shape   AS INTEGER
  35. END TYPE
  36.  
  37. $INCLUDE "UTILS.INC"
  38. $INCLUDE "MODEX.INC"
  39.  
  40. %MaxShapes = 32
  41.  
  42. DIM Img(32) AS SHARED ShapeType
  43.  
  44.     INIT.RANDOM
  45.  
  46.     LOAD.SHAPES
  47.  
  48.     DEMO.RES %Mode320x200, 320, 200
  49.     DEMO.RES %Mode320x400, 320, 400
  50.  
  51.     DEMO.RES %Mode360x200, 360, 200
  52.     DEMO.RES %Mode360x400, 360, 400
  53.  
  54.     DEMO.RES %Mode320x240, 320, 240
  55.     DEMO.RES %Mode320x480, 320, 480
  56.  
  57.     DEMO.RES %Mode360x240, 360, 240
  58.     DEMO.RES %Mode360x480, 360, 480
  59.  
  60.     PAGE.DEMO
  61.  
  62.     SET.VIDEO.MODE 3
  63. END
  64.  
  65.  
  66. SUB DEMO.RES (Mode, Xmax, Ymax)
  67.  
  68.     IF SET.MODEX%(Mode) = 0 THEN
  69.         ERROR.OUT "Unable to SET.MODEX" + STR$(Mode)
  70.     END IF
  71.  
  72.     XCenter = Xmax \ 2
  73.  
  74.     X1 = 10
  75.     Y1 = 10
  76.     X2 = Xmax - 1
  77.     Y2 = Ymax - 1
  78.  
  79.     FOR Z = 0 TO 3
  80.         Colr = 31 - Z * 2
  81.         DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr
  82.         DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr
  83.         DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr
  84.         DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr
  85.     NEXT Z
  86.  
  87.     XChars = Xmax \ 10
  88.     YChars = Ymax \ 10
  89.  
  90.     FOR X = 0 TO XChars - 1
  91.         TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7)
  92.         DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15
  93.     NEXT X
  94.  
  95.     FOR Y = 0 TO YChars - 1
  96.         TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7)
  97.         DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15
  98.     NEXT Y
  99.  
  100.     ' Draw Lines
  101.  
  102.     FOR X = 0 TO 63
  103.         N = 15 + X * .75
  104.         SET.DAC.REGISTER 64 + X, N, N, N
  105.         SET.DAC.REGISTER 128 + X, 0, N, N
  106.  
  107.         DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X
  108.         DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X
  109.  
  110.     NEXT X
  111.     TPRINT.TEXT "LINE TEST", 37, 130, %c.BLUE
  112.  
  113.     Y = 60: Gap = 0
  114.     FOR X = 0 TO 9
  115.         FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X
  116.         FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X
  117.         FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X
  118.         Y = Y + Gap + 2
  119.         Gap = Gap + 1
  120.     NEXT X
  121.     TPRINT.TEXT "FILL TEST", 110, 46, %c.GREEN
  122.  
  123.  
  124.     FOR X = 190 TO 250 STEP 2
  125.         FOR Y = 60 TO 122 STEP 2
  126.           SET.POINT X, Y, X + Y + X + Y
  127.         NEXT Y
  128.     NEXT X
  129.  
  130.     TPRINT.TEXT "PIXEL TEST", 182, 130, %c.RED
  131.  
  132.     FOR X = 190 TO 250 STEP 2
  133.         FOR Y = 60 TO 122 STEP 2
  134.           IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN
  135.              ERROR.OUT "READ.PIXEL Failure"
  136.           END IF
  137.         NEXT Y
  138.     NEXT X
  139.  
  140.  
  141.  
  142.     Msg$ = " This is a MODE X demo "
  143.     PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, %c.bRED, %c.BLUE
  144.     Msg$ = "Screen Resolution is     by    "
  145.     Xp = XCenter - (LEN(Msg$) * 4)
  146.     PRINT.TEXT Msg$, Xp, 30, %c.bGREEN, %c.BLACK
  147.  
  148.     PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, %c.bPURPLE, %c.BLACK
  149.     PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, %c.bWHITE, %c.BLACK
  150.  
  151.     FOR X = 0 TO 15
  152.         SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3
  153.         DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X
  154.     NEXT X
  155.     TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, %c.YELLOW
  156.  
  157.     X = GET.KEY%
  158.     IF X = %KyESC THEN ERROR.OUT "ABORT"
  159.  
  160. END SUB
  161.  
  162. SUB ERROR.OUT (Message$)
  163.  
  164.     SET.VIDEO.MODE 3
  165.     PRINT Message$
  166.     END
  167.  
  168. END SUB
  169.  
  170. FUNCTION GET.KEY%
  171.  
  172.     DO
  173.         X = SCAN.KEYBOARD
  174.     LOOP UNTIL X
  175.  
  176.     GET.KEY% = X
  177.  
  178. END FUNCTION
  179.  
  180. SUB LOAD.SHAPES
  181.  
  182. DIM Grid(1 TO 32, 1 TO 32)
  183.  
  184.     FOR Shape = 0 TO %MaxShapes - 1
  185.  
  186.         FOR Y = 1 TO 32
  187.         FOR X = 1 TO 32
  188.             Grid(X, Y) = 0
  189.         NEXT X
  190.         NEXT Y
  191.  
  192.         Style = RANDOM.INT(6)
  193.         Colour = 1 + RANDOM.INT(15)
  194.         
  195.         SELECT CASE Style
  196.  
  197.         CASE 0:         ' Solid Box
  198.  
  199.             DO
  200.                 xWidth = 3 + RANDOM.INT(30)
  201.                 yWidth = 3 + RANDOM.INT(30)
  202.             LOOP UNTIL ((xWidth * yWidth) <= 512)
  203.  
  204.             FOR Y = 1 TO yWidth
  205.                 FOR X = 1 TO xWidth
  206.                     Grid(X, Y) = Colour
  207.                 NEXT X
  208.             NEXT Y
  209.  
  210.         CASE 1:         ' Hollow Box
  211.  
  212.             DO
  213.                 xWidth = 5 + RANDOM.INT(28)
  214.                 yWidth = 5 + RANDOM.INT(28)
  215.             LOOP UNTIL ((xWidth * yWidth) <= 512)
  216.  
  217.             FOR Y = 1 TO yWidth
  218.                 FOR X = 1 TO xWidth
  219.                     Grid(X, Y) = Colour
  220.                 NEXT X
  221.             NEXT Y
  222.  
  223.             HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1)
  224.             HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1)
  225.  
  226.             FOR Y = HollowY + 1 TO yWidth - HollowY
  227.                 FOR X = HollowX + 1 TO xWidth - HollowX
  228.                     Grid(X, Y) = nil
  229.                 NEXT X
  230.             NEXT Y
  231.  
  232.         CASE 2:         ' Solid Diamond
  233.  
  234.             xWidth = 3 + 2 * RANDOM.INT(10)
  235.             yWidth = xWidth
  236.             Centre = xWidth \ 2
  237.  
  238.             FOR Y = 0 TO Centre
  239.                 FOR X = 0 TO Y
  240.                     Grid(Centre - X + 1, Y + 1) = Colour
  241.                     Grid(Centre + X + 1, Y + 1) = Colour
  242.                     Grid(Centre - X + 1, yWidth - Y) = Colour
  243.                     Grid(Centre + X + 1, yWidth - Y) = Colour
  244.                 NEXT X
  245.             NEXT Y
  246.  
  247.  
  248.         CASE 3:         ' Hollow Diamond
  249.  
  250.  
  251.             xWidth = 3 + 2 * RANDOM.INT(10)
  252.             yWidth = xWidth
  253.             Centre = xWidth \ 2
  254.             sWidth = RANDOM.INT(Centre)
  255.  
  256.             FOR Y = 0 TO Centre
  257.                 FOR X = 0 TO Y
  258.                     IF X + (Centre - Y) >= sWidth THEN
  259.                         Grid(Centre - X + 1, Y + 1) = Colour
  260.                         Grid(Centre + X + 1, Y + 1) = Colour
  261.                         Grid(Centre - X + 1, yWidth - Y) = Colour
  262.                         Grid(Centre + X + 1, yWidth - Y) = Colour
  263.                     END IF
  264.                 NEXT X
  265.             NEXT Y
  266.  
  267.         CASE 4:         ' Ball
  268.  
  269.             xWidth = 7 + 2 * RANDOM.INT(8)
  270.             yWidth = xWidth
  271.             Centre = 1 + xWidth \ 2
  272.  
  273.             FOR Y = 1 TO yWidth
  274.                 FOR X = 1 TO xWidth
  275.                     D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
  276.                     IF D < Centre THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
  277.                 NEXT X
  278.             NEXT Y
  279.  
  280.         CASE 5:         ' Ball
  281.  
  282.  
  283.             xWidth = 7 + 2 * RANDOM.INT(8)
  284.             yWidth = xWidth
  285.             Centre = 1 + xWidth \ 2
  286.             sWidth = RANDOM.INT(xWidth)
  287.  
  288.             FOR Y = 1 TO yWidth
  289.                 FOR X = 1 TO xWidth
  290.                     D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
  291.                     IF D < Centre AND D >= sWidth THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
  292.                 NEXT X
  293.             NEXT Y
  294.  
  295.         END SELECT
  296.  
  297.         Img(Shape).xWidth = xWidth
  298.         Img(Shape).yWidth = yWidth
  299.  
  300.         A$ = STRING$(xWidth * yWidth, nil)
  301.  
  302.         c = 1
  303.         FOR Y = 1 TO yWidth
  304.             FOR X = 1 TO xWidth
  305.                 MID$(A$, c, 1) = CHR$(Grid(X, Y))
  306.                 c = c + 1
  307.             NEXT X
  308.         NEXT Y
  309.  
  310.         Img(Shape).ImgData = A$
  311.  
  312.  
  313.     NEXT Shape
  314.  
  315. END SUB
  316.  
  317. SUB PAGE.DEMO
  318.  
  319. %MaxSprites = 64
  320.  
  321. DIM Obj(%MaxSprites) AS Sprite
  322. DIM LastX(%MaxSprites, 1), LastY(%MaxSprites, 1)
  323. DIM LastObjects(1)
  324.  
  325.     ScreenX = 360: ScreenY = 240
  326.  
  327.     IF SET.VGA.MODEX%(%Mode320x200, ScreenX, ScreenY, 3) = 0 THEN
  328.         ERROR.OUT "Unable to SET.VGA.MODEX" + STR$(Mode)
  329.     END IF
  330.  
  331.     SET.ACTIVE.PAGE 0
  332.  
  333.     CLEAR.VGA.SCREEN %c.BLACK
  334.  
  335.     PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, %c.bWHITE, %c.BLACK
  336.  
  337.     DRAW.LINE 10, 18, 350, 18, %c.YELLOW
  338.     PRINT.TEXT "SET.ACTIVE.PAGE", 10, 20, %c.bBLUE, %c.BLACK
  339.     PRINT.TEXT "SET.DISPLAY.PAGE", 10, 30, %c.GREEN, %c.BLACK
  340.     PRINT.TEXT "SET.DAC.REGISTER", 10, 40, %c.RED, %c.BLACK
  341.     PRINT.TEXT "CLEAR.VGA.SCREEN", 10, 50, %c.CYAN, %c.BLACK
  342.  
  343.     PRINT.TEXT "TDRAW.BITMAP", 10, 60, %c.PURPLE, %c.BLACK
  344.     PRINT.TEXT "COPY.PAGE", 10, 70, %c.GREEN, %c.BLACK
  345.     PRINT.TEXT "COPY.BITMAP", 10, 80, %c.CYAN, %c.BLACK
  346.  
  347.     PRINT.TEXT "GPRINTC", 10, 90, %c.BLUE, %c.BLACK
  348.     PRINT.TEXT "TGPRINTC", 10, 100, %c.GREEN, %c.BLACK
  349.     PRINT.TEXT "SET.WINDOW", 10, 110, %c.RED, %c.BLACK
  350.  
  351.     PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, %c.bBLUE, %c.BLACK
  352.     PRINT.TEXT "    SMOOTH SCROLLING", 190, 30, %c.GREEN, %c.BLACK
  353.     PRINT.TEXT "    SPRITE ANIMATION", 190, 40, %c.CYAN, %c.BLACK
  354.     PRINT.TEXT "       PAGE FLIPPING", 190, 50, %c.RED, %c.BLACK
  355.     PRINT.TEXT "       COLOR CYCLING", 190, 60, %c.PURPLE, %c.BLACK
  356.  
  357.  
  358.     FOR X = 0 TO 60
  359.         SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X
  360.         SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X
  361.     NEXT X
  362.  
  363.     c = 0: DC = 1
  364.     FOR X = 0 TO ScreenX \ 2
  365.         DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50
  366.         DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50
  367.         c = c + DC
  368.         IF c = 0 OR c = 60 THEN DC = -DC
  369.     NEXT X
  370.  
  371.     TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, %c.bWHITE
  372.     TPRINT.TEXT "< > = Faster   < > = Slower", 72, 204, %c.bGREEN
  373.     TPRINT.TEXT "< > = Fewer Shapes  < > = More Shapes", 32, 218, %c.bCYAN
  374.  
  375.     TGPRINTC 43,  80, 204, %c.YELLOW
  376.     TGPRINTC 45, 200, 204, %c.YELLOW
  377.  
  378.     TGPRINTC 25,  40, 218, %c.YELLOW
  379.     TGPRINTC 24, 200, 218, %c.YELLOW
  380.  
  381.     COPY.PAGE 0, 1
  382.     COPY.PAGE 0, 2
  383.  
  384.     FOR X = 1 TO %MaxSprites
  385.         DO
  386.             Obj(X).XDir = RANDOM.INT(7) - 3
  387.             Obj(X).YDir = RANDOM.INT(7) - 3
  388.         LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  389.  
  390.         Obj(X).Shape = X MOD %MaxShapes
  391.  
  392.         SpriteX = Img(Obj(X).Shape).xWidth
  393.         SpriteY = Img(Obj(X).Shape).yWidth
  394.  
  395.         Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2)
  396.         Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2)
  397.  
  398.         LastX(X, 0) = Obj(X).Xpos
  399.         LastX(X, 1) = Obj(X).Xpos
  400.         LastY(X, 0) = Obj(X).Ypos
  401.         LastY(X, 1) = Obj(X).Ypos
  402.     NEXT X
  403.  
  404.     CurrentPage = 0
  405.  
  406.     'View Shift...
  407.  
  408.     ViewX   = 0
  409.     ViewY   = 0
  410.     ViewMax = 3
  411.     ViewCnt = 0
  412.     ViewXD  = 1
  413.     ViewYD  = 1
  414.  
  415.     SetColor  = 3: SDir = 1
  416.     PrevColor = 0: PDir = 1
  417.  
  418.     VisObjects = %MaxSprites \ 2
  419.     LastObjects(0) = 0
  420.     LastObjects(1) = 0
  421.  
  422. DRAW.LOOP:
  423.  
  424.     SET.ACTIVE.PAGE CurrentPage
  425.  
  426.     ' Erase Old Images
  427.  
  428.     FOR X = 1 TO LastObjects(CurrentPage)
  429.  
  430.         X1 = LastX(X, CurrentPage) AND &HFFFC
  431.         Y1 = LastY(X, CurrentPage)
  432.         X2 = ((LastX(X, CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3
  433.         Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1
  434.  
  435.         COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1
  436.  
  437.     NEXT X
  438.  
  439.     ' Draw new images
  440.  
  441.     FOR X = 1 TO VisObjects
  442.  
  443.         SpriteX = Img(Obj(X).Shape).xWidth
  444.         SpriteY = Img(Obj(X).Shape).yWidth
  445.  
  446.         ' Move Sprite
  447.  
  448. REDOX:
  449.         NewX = Obj(X).Xpos + Obj(X).XDir
  450.         IF NewX < 0 OR NewX + SpriteX > ScreenX THEN
  451.             Obj(X).XDir = -Obj(X).XDir
  452.             IF RANDOM.INT(20) = 1 THEN
  453.                 DO
  454.                     Obj(X).XDir = RANDOM.INT(7) - 3
  455.                     Obj(X).YDir = RANDOM.INT(7) - 3
  456.                 LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  457.                 GOTO REDOX
  458.             END IF
  459.         END IF
  460.         Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir
  461.  
  462. REDOY:
  463.         NewY = Obj(X).Ypos + Obj(X).YDir
  464.         IF NewY < 0 OR NewY + SpriteY > ScreenY THEN
  465.             Obj(X).YDir = -Obj(X).YDir
  466.             IF RANDOM.INT(20) = 1 THEN
  467.                 DO
  468.                     Obj(X).XDir = RANDOM.INT(7) - 3
  469.                     Obj(X).YDir = RANDOM.INT(7) - 3
  470.                 LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
  471.                 GOTO REDOY
  472.             END IF
  473.         END IF
  474.         Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir
  475.  
  476.         'Draw Sprite
  477.  
  478.         TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY
  479.  
  480.         LastX(X, CurrentPage) = Obj(X).Xpos
  481.         LastY(X, CurrentPage) = Obj(X).Ypos
  482.  
  483.     NEXT X
  484.  
  485.     LastObjects(CurrentPage) = VisObjects
  486.  
  487.     ' Pan Screen Back & Forth
  488.  
  489.     ViewCnt = ViewCnt + 1
  490.     IF ViewCnt >= ViewMax THEN
  491.         ViewX = ViewX + ViewXD
  492.         IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD
  493.         IF ViewXD < 0 THEN
  494.             ViewY = ViewY + ViewYD
  495.             IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD
  496.         END IF
  497.  
  498.         SET.WINDOW CurrentPage, ViewX, ViewY
  499.  
  500.         ViewCnt = 0
  501.     ELSE
  502.         SET.DISPLAY.PAGE CurrentPage
  503.     END IF
  504.  
  505.     ' Cycle Colors
  506.  
  507.     SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
  508.     SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor
  509.  
  510.     SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
  511.     SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor
  512.  
  513.     SetColor = SetColor + SDir
  514.     IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir
  515.  
  516.     PrevColor = PrevColor + PDir
  517.     IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir
  518.  
  519.     CurrentPage = 1 - CurrentPage
  520.  
  521.     Code = SCAN.KEYBOARD
  522.  
  523.     IF Code = %False THEN GOTO DRAW.LOOP
  524.  
  525.     IF Code = %KyPlus THEN
  526.         IF ViewMax < 12 THEN ViewMax = ViewMax + 1
  527.         GOTO DRAW.LOOP
  528.     END IF
  529.  
  530.     IF Code = %KyMinus THEN
  531.         IF ViewMax > 1 THEN ViewMax = ViewMax - 1
  532.         IF ViewCnt >= ViewMax THEN ViewCnt = 0
  533.         GOTO DRAW.LOOP
  534.     END IF
  535.  
  536.     IF Code = %KyUp THEN
  537.         IF VisObjects < %MaxSprites THEN VisObjects = VisObjects + 1
  538.         GOTO DRAW.LOOP
  539.     END IF
  540.  
  541.     IF Code = %KyDown THEN
  542.         IF VisObjects > 1 THEN VisObjects = VisObjects - 1
  543.         GOTO DRAW.LOOP
  544.     END IF
  545.  
  546. END SUB
  547.  
  548. SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB)
  549.  
  550.     IF LEN(Text$) = 0 THEN EXIT SUB
  551.     PRINT.STR STRSEG(Text$), STRPTR(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB
  552.  
  553. END SUB
  554.  
  555. SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF)
  556.  
  557.     IF LEN(Text$) = 0 THEN EXIT SUB
  558.  
  559.     TPRINT.STR STRSEG(Text$), STRPTR(Text$), LEN(Text$), Xpos, Ypos, ColorF
  560.  
  561. END SUB
  562.